package com.qingcloud.adminbackend.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qingcloud.adminbackend.entity.sysfunction.*;
import com.qingcloud.adminbackend.entity.sysorder.SysOrder;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 系统功能表 Mapper 接口
 * </p>
 *
 * @author liyuhong
 * @since 2018-11-16
 */
public interface SysFunctionMapper extends BaseMapper<SysFunction> {
    /**
     * 1:网格化菜单；2：健康云菜单 下的所有模块
     *
     * @return
     */
    List<SysFunction> getFunctionByUserId(@Param("isAdmin") boolean isAdmin, @Param("sysFunctionDTO") SysFunctionDTO sysFunctionDTO);

    /**
     * 根据组织ID查询功能列表
     *
     * @return
     */
    List<SysFunction> findByOrgId(@Param("id") String id);

    /**
     * 删除客户和功能模块的关系表
     *
     * @param orgIds
     */
    void deleteSysOrgFunction(@Param("orgIds") List<String> orgIds);

    /**
     * 查询展示模块
     * 1:网格化菜单；2：健康云菜单 下的所有模块
     *
     * @param menuTypes
     * @return
     */
    List<ModuleDTO> getModuleByUserId(@Param("menuTypes") List<String> menuTypes);

    /**
     * 根据模块查询功能
     *
     * @param moduleIds 模块IDS
     * @return
     */
    Set<String> getFunctionByModuleId(@Param("moduleIds") List<String> moduleIds);

    /**
     * 根据客户ID获取功能
     *
     * @param orgId
     * @return
     */
    Set<String> getFunctionByOrgId(@Param("orgId") String orgId);

    /**
     * 订单绑定的功能
     *
     * @param orderId
     * @return
     */
    Set<String> getOrderFunctionIds(@Param("orderId") String orderId);

    /**
     * 多订单绑定的功能
     *
     * @param orderIds
     * @return
     */
    Set<String> getOrderFunctionIdsByOrderIds(@Param("orderIds") Set<String> orderIds);

    /**
     * 删除当前订单以外的功能
     *
     * @param orgIds
     * @param functionIds
     */
    void deleteSysOrgFunctionByorgIds(@Param("orgIds") List<String> orgIds, @Param("functionIds") Set<String> functionIds);

    /**
     * 根据功能ids查询上级id
     *
     * @param functionIds
     * @return
     */
    Set<String> findParentIdByIds(@Param("functionIds") Set<String> functionIds);

    /**
     * 查询订单删除的功能
     *
     * @param sysOrder
     * @return
     */
    Set<String> getFunctionByOrderOrgId(@Param("sysOrder") SysOrder sysOrder);

    /**
     * 删除订单的功能
     *
     * @param orderIds
     * @param ids
     */
    void deleteOrderFunctionByOrgId(@Param("orderIds") List<String> orderIds, @Param("ids") Set<String> ids);

    /**
     * 删除客户下用户的指定功能
     *
     * @param userIds
     * @param ids
     */
    void deleteByUserFunctions(@Param("userIds") List<String> userIds, @Param("ids") Set<String> ids);

    /**
     * 根据功能ids查询下级id
     *
     * @param functionIds
     */
    Set<String> findFunctionIdByParentIds(@Param("functionIds") Set<String> functionIds);

    /**
     * 获取角色对应的功能
     *
     * @param userId
     * @return
     */
    List<SysFunction> getRoleFunctions(@Param("userId") String userId);

    /**
     * 获取客户下的功能
     *
     * @param orgId
     * @return
     */
    List<SysFunction> getOrgFunction(@Param("orgId") String orgId);

    /**
     * 获取订单功能
     *
     * @param orgId
     * @return
     */
    List<SysFunction> getOrderFunction(@Param("orgId") String orgId);

    /**
     * 功能模块分页查询
     */
    List<SysFunction> pageFunction(@Param("userId") String userId,
                                   @Param("isAdmin") Boolean isAdmin,
                                   @Param("params") FunctionPageRequest functionPageRequest);

    /**
     * 根据业务菜单类型查询所有记录（包括禁用）
     */
    List<SysFunction> findByMenuType(@Param("menuType") Integer menuType);

    /**
     * 单独获取菜单数据需要的记录
     * @param menuType
     * @return
     */
    List<SysFunction> findByMenuTreeByType(@Param("menuType") Integer menuType);

    /**
     * 统计功能模块总数量
     */
    int countFunction(@Param("userId") String userId,
                      @Param("isAdmin") Boolean isAdmin,
                      @Param("params") FunctionPageRequest functionPageRequest);


    /**
     * 新增功能
     */
    void insertFunc(@Param("params") SysFunction sysFunctionDTO);

    /**
     * 修改功能
     */
    void updateFunction(@Param("params") SysFunction sysFunctionDTO);

    void updateOrderNo(@Param("id") String id, @Param("orderNo") Integer orderNo,
                       @Param("modifyBy") String modifyBy, @Param("modifyDt") String modifyDt);

    void enableOrDisable(@Param("id") String id, @Param("deleteFlag") Integer deleteFlag,
                         @Param("modifyBy") String modifyBy, @Param("modifyDt") String modifyDt);

    /**
     * 通过功能ID列表获取对应的功能详情信息
     *
     * @param functionIdList
     * @return
     */
    List<SysFunction> findByFunctionIds(@Param("functionIdList") List<String> functionIdList);

    /**
     * 通过id获取功能模块
     *
     * @param id
     * @return
     */
    SysFunction findOneById(@Param("id") String id);

    /**
     * 通过ID批量删除功能模块
     *
     * @param ids
     */
    void deleteByIds(@Param("ids") List<String> ids);

    /**
     * 获取当前登录用户的所有功能列表
     *
     * @param isAdmin
     * @param module
     * @param userId
     * @return
     */
    List<SysFunction> findByUserId(@Param("isAdmin") boolean isAdmin,
                                   @Param("userId") String userId,
                                   @Param("module") Integer module);

    /**
     * 获取当前用户所有功能模块ID集合
     */
    Set<String> findFunIdByUserId(@Param("userId") String userId);


    /**
     * 判断当前模块是否是父模块(0不是父模块，大于0为父模块)
     *
     * @param pid
     * @return
     */
    List<String> findCountByParentId(@Param("pid") String pid);

    /**
     * 批量查询父ID
     *
     * @param ids
     */
    List<String> findParentIdByFunctionId(@Param("ids") List<String> ids);

    /**
     * 通过CODE统计模块数量
     */
    int countByCodeIgnoreId(@Param("code") String code,
                            @Param("ignoreId") String ignoreId);

    /**
     * 通过父模块ID获取模块信息
     */
    List<SysFunction> findByParentId(@Param("parentId") String parentId,
                                     @Param("userId") String userId,
                                     @Param("isAdmin") Boolean isAdmin);

    /**
     * 查询子权限
     */
    List<SysFunction> findChild(@Param("parentId") String parentId);

    /**
     * 通过用户ID获取所有功能模块CODE
     */
    Set<String> findCodeByUserId(@Param("isAdmin") boolean isAdmin,
                                 @Param("userId") String userId);

    List<SysFunction> findByLevel(@Param("level") Integer level);

}
